 1.电商分析之--会员活跃度之高仿日启动数据测试中Hive on Tez测试
   
   数据采集 => ODS => DWD => DWS => ADS> MySQL
   活跃会员、新增会员、会员留存
   
   DAU： Daily Active User（日活跃用户）
   MAU： monthly active user（月活跃用户）
   假设App的DAU在1000W左右，日启动数据大概1000W条；
   测试3天的数据：7月21日、7月22日、7月23日。1000W条数据约3.5G+，每条记录
约370字节。
   
   1).Hive on MR测试
   选择 7月21日 的启动日志进行测试
   (1).使用 flume 采集数据（采集3天的数据）
   修改flume的参数：1G滚动一次；加大channel缓存；加大刷新 hdfs 的缓存

# 配置文件滚动方式（文件大小1G）
a1.sinks.k1.hdfs.rollSize = 1073741824

a1.channels.c1.capacity = 500000
a1.channels.c1.transactionCapacity = 20000

# 向hdfs上刷新的event个数
a1.sinks.k1.hdfs.batchSize = 10000

# 清理工作。删除元数据文件、日志、hdfs等文件
/*
rm -f /data/lagoudw/conf/startlog_position.json
rm -rf /data/lagoudw/logs/start/*
hdfs dfs -rm -r -f /user/data/logs/start/dt=2020-07-21

*/

# 启动flume
flume-ng agent --conf /opt/apps/flume-1.9/conf --conf-file
/data/lagoudw/conf/flume-log2hdfs4.conf -name a1 -
Dflume.root.logger=INFO,console
# 写日志
java -cp data-generator-1.1-SNAPSHOT-jar-with-dependencies.jar
com.lagou.ecommerce.AppStart 1 10000000 2020-07-21 >
/data/lagoudw/logs/start/start0721.log

java -cp data-generator-1.1-SNAPSHOT-jar-with-dependencies.jar
com.lagou.ecommerce.AppStart 6000000 16000000 2020-07-22 >
/data/lagoudw/logs/start/start0722.log

java -cp data-generator-1.1-SNAPSHOT-jar-with-dependencies.jar
com.lagou.ecommerce.AppStart 8000000 18000000 2020-07-23 >
/data/lagoudw/logs/start/start0723.log

# 检查 hdfs 文件是否到达
hdfs dfs -ls /user/data/logs/start/dt=2020-07-21
   1 个文件大小3.5 G，时间4分钟左右
   (2).执行脚本
   SCRIPT_HOME=/data/lagoudw/script/member_active

   # 加载 ODS 层数据（文件与表建立关联）
   sh $SCRIPT_HOME/ods_load_startlog.sh 2020-07-21

   # 加载 ODS 层数据（解析json数据）
   sh $SCRIPT_HOME/dwd_load_startlog.sh 2020-07-21

   # number of mappers: 14; number of reducers: 0
   # 是一个 map-only 的 Task；只对输入的数据做格式上的转换，没有聚合操作
   # (即没有reduce task)
   # mapred.max.split.size=256M；3.5G / 256M = 14 Mapper Task
   # 活跃会员
   sh $SCRIPT_HOME/dws_load_member_start.sh 2020-07-21
   # number of mappers: 3; number of reducers: 2
   # 调整了task的内存分配(根据实际情况分配)
   # 任务执行时间：3.5 + 3 + 3 = 10分钟
   # ODS(Text) => 14个map => DWD(parquet) => 小文件合并 256M切分 => 3 map
   
   sh $SCRIPT_HOME/ads_load_member_active.sh 2020-07-21

   # 新增会员
   sh $SCRIPT_HOME/dws_load_member_add_day.sh 2020-07-21
   sh $SCRIPT_HOME/ads_load_member_add.sh 2020-07-21

   # 会员留存
   sh $SCRIPT_HOME/dws_load_member_retention_day.sh 2020-07-21
   sh $SCRIPT_HOME/ads_load_member_retention.sh 2020-07-21
   相关表：
   select count(*) from ods.ods_start_log where dw='2020-07-21';
   
   select count(*) from dwd.dwd_start_log where dw='2020-07-21';
   
   select count(*) from dws.dws_member_start_day where dw='2020-07-21';
   select count(*) from dws.dws_member_start_week where dw='2020-07-21';
   select count(*) from dws.dws_member_start_month where dw='2020-07-21';
   select count(*) from dws.dws_member_add_day where dw='2020-07-21';
   select count(*) from dws.dws_member_retention_day where dw='2020-07-21';
   
   select count(*) from ads.ads_member_active_count where dw='2020-07-21';
   select count(*) from ads.ads_new_member_cnt where dw='2020-07-21';
   select count(*) from ads.ads_member_retention_count where dw='2020-07-21';
   select count(*) from ads.ads_member_retention_rate where dw='2020-07-21';
   遇到的问题：
   Error: Java heap space
   原因：内存分配问题
   解决思路：给map、reduce task分配合理的内存；map、reduce task处理合理的数据
   现在情况下map task分配了多少内存？使用的是缺省参数每个task分配200M内存
【mapred.child.java.opts】
   每个节点：8 core / 32G ；mapred.child.java.opts = 3G
<property>
        <name>mapred.child.java.opts</name>
        <value>-Xmx3072m</value>
</property>
   调整map个数：
   mapred.max.split.size=256000000
   调整reduce个数：
   hive.exec.reducers.bytes.per.reducer
   hive.exec.reducers.max
   2).Tez简介及安装
   参见附录二 Hive on Tez
   3).Hive on Tez测试
   07-22(新增600W) / 0723(新增200W)：1000W条左右，
   执行脚本
   SCRIPT_HOME=/data/lagoudw/script/member_active

   # 加载 ODS 层数据（文件与表建立关联）
   sh $SCRIPT_HOME/ods_load_startlog.sh 2020-07-22

   # 加载 ODS 层数据（解析json数据）
   sh $SCRIPT_HOME/dwd_load_startlog.sh 2020-07-22

   # 活跃会员
   sh $SCRIPT_HOME/dws_load_member_start.sh 2020-07-22
   sh $SCRIPT_HOME/ads_load_member_active.sh 2020-07-22

   # 新增会员
   sh $SCRIPT_HOME/dws_load_member_add_day.sh 2020-07-22
   sh $SCRIPT_HOME/ads_load_member_add.sh 2020-07-22

   # 会员留存
   sh $SCRIPT_HOME/dws_load_member_retention_day.sh 2020-07-22
   sh $SCRIPT_HOME/ads_load_member_retention.sh 2020-07-22
   
   SCRIPT_HOME=/data/lagoudw/script/member_active

   # 加载 ODS 层数据（文件与表建立关联）
   sh $SCRIPT_HOME/ods_load_startlog.sh 2020-07-23

   # 加载 ODS 层数据（解析json数据）
   sh $SCRIPT_HOME/dwd_load_startlog.sh 2020-07-23
   
   # 活跃会员
   sh $SCRIPT_HOME/dws_load_member_start.sh 2020-07-23
   sh $SCRIPT_HOME/ads_load_member_active.sh 2020-07-23

   # 新增会员
   sh $SCRIPT_HOME/dws_load_member_add_day.sh 2020-07-23
   sh $SCRIPT_HOME/ads_load_member_add.sh 2020-07-23

   # 会员留存
   sh $SCRIPT_HOME/dws_load_member_retention_day.sh 2020-07-23
   sh $SCRIPT_HOME/ads_load_member_retention.sh 2020-07-23
   
 2.会员留存率的计算
 
   script/member_active/ads_load_member_retention.sh(已修改Bug)

#!/bin/bash

source /etc/profile

if [ -n "$1" ] ;then
    do_date=$1
else
    do_date=`date -d "-1 day" +%F`
fi

sql="
insert overwrite table ads.ads_member_retention_count
partition (dt='$do_date')
select add_date, retention_date,
count(*) retention_count
from dws.dws_member_retention_day
where dt='$do_date'
group by add_date, retention_date;

insert overwrite table ads.ads_member_retention_rate
partition (dt='$do_date')
select t1.add_date,
t1.retention_day,
t1.retention_count,
t2.cnt,
t1.retention_count/t2.cnt*100
from ads.ads_member_retention_count t1 join
ads.ads_new_member_cnt t2 on t1.add_date=t2.dt
where t1.dt='$do_date';
"
   
hive -e "$sql"
   修改后的代码（计算留存率）：
   select t1.*, t2.*
from ads.ads_member_retention_count t1 join
ads.ads_new_member_cnt t2 on
t1.add_date=t2.dt
where t1.dt='2020-07-23';
   
   备注：主要改的是连接条件。将连接条件改为：t1.add_date=t2.dt
   SCRIPT_HOME=/data/lagoudw/script/member_active
   sh $SCRIPT_HOME/ads_load_member_retention.sh 2020-07-23